// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:mirrors';
import 'package:expect/expect.dart';

import 'stringify.dart';

class A<T> {
  var instanceVariable;
  get instanceGetter => null;
  set instanceSetter(x) => x;
  instanceMethod() => null;

  var _instanceVariable;
  get _instanceGetter => null;
  set _instanceSetter(x) => x;
  _instanceMethod() => null;

  static var staticVariable;
  static get staticGetter => null;
  static set staticSetter(x) => x;
  static staticMethod() => null;

  static var _staticVariable;
  static get _staticGetter => null;
  static set _staticSetter(x) => x;
  static _staticMethod() => null;
}

main() {
  ClassMirror cm = reflect(new A<String>()).type;
  Expect.setEquals([
    'Variable(s(_instanceVariable) in s(A), private)',
    'Variable(s(_staticVariable) in s(A), private, static)',
    'Variable(s(instanceVariable) in s(A))',
    'Variable(s(staticVariable) in s(A), static)'
  ], cm.declarations.values.where((dm) => dm is VariableMirror).map(stringify),
      'variables');

  Expect.setEquals(
      [
        'Method(s(_instanceGetter) in s(A), private, getter)',
        'Method(s(_staticGetter) in s(A), private, static, getter)',
        'Method(s(instanceGetter) in s(A), getter)',
        'Method(s(staticGetter) in s(A), static, getter)'
      ],
      cm.declarations.values
          .where((dm) => dm is MethodMirror && dm.isGetter)
          .map(stringify),
      'getters');

  Expect.setEquals(
      [
        'Method(s(_instanceSetter=) in s(A), private, setter)',
        'Method(s(_staticSetter=) in s(A), private, static, setter)',
        'Method(s(instanceSetter=) in s(A), setter)',
        'Method(s(staticSetter=) in s(A), static, setter)'
      ],
      cm.declarations.values
          .where((dm) => dm is MethodMirror && dm.isSetter)
          .map(stringify),
      'setters');

  Expect.setEquals(
      [
        'Method(s(_instanceMethod) in s(A), private)',
        'Method(s(_staticMethod) in s(A), private, static)',
        'Method(s(instanceMethod) in s(A))',
        'Method(s(staticMethod) in s(A), static)'
      ],
      cm.declarations.values
          .where((dm) => dm is MethodMirror && dm.isRegularMethod)
          .map(stringify),
      'methods');

  Expect.setEquals(
      ['Method(s(A) in s(A), constructor)'],
      cm.declarations.values
          .where((dm) => dm is MethodMirror && dm.isConstructor)
          .map(stringify),
      'constructors');
}
